iT邦幫忙

0

(C++)如何將指定時間日期轉換成UNIX時間&如何將UNIX時間轉換成日期

  • 分享至 

  • xImage
  •  

雖然稱不上多難,但是找可用的方法東拼西湊還是要花點時間,紀錄一下幫看到這篇的人省點時間
需求:C++語言標準ISO C++20
只使用STL庫,不需額外Library

#include <chrono>
#include <sstream>

#include <iostream>

string date2EpochTime()
{
    const int sec = 30;              //秒數,兩位數
    const int minute = 30;           //分鐘,兩位數
    const int hour = 6;              //小時,24小時制
    const int mday = 15;             //日期
    const int mon = 5;               //月份,實際還要再+1,所以這代表6月
    const int year = 120;            //年份差,與1900年的差距,所以這是2020年
    struct tm tm_tm = {sec, minute, hour, mday, mon, year};
    const time_t time_t_tm = mktime(&tm_tm);

	//注意,在轉成epoch time時API會自動扣掉當前時區的小時差,所以在某些情況下,
    //可能會發生時區轉換導致的錯誤。比如說憑證中的到期日使用的是UTC,但是轉換時會視為GMT+8,
    //所以轉換出來的epoch time會比實際上慢了8小時,解決辦法是取時區時間差在幫他補回去,如下:

	//取時區時間差
    const auto chrono_now = std::chrono::system_clock::now();
    const auto offset_seconds = std::chrono::current_zone()->get_info(chrono_now).offset;
	//將時間轉成epoch time
    const auto time_point = std::chrono::system_clock::from_time_t(time_t_tm);
    //把時區時間差補回去
    const auto timeSinceEpoch = (time_point + offset_seconds).time_since_epoch().count();
    
    std::stringstream stream;
    stream << timeSinceEpoch;

    //轉出來的epoch time取前10位,單位到秒
    return stream.str().substr(0, 10);
}

std::string epochTime2Date(const std::string& epochTime) 
{
    long lEpochTime = std::stol(epochTime);
    auto date = std::chrono::sys_time<std::chrono::seconds>{std::chrono::seconds{lEpochTime}};
    std::string timezone = std::chrono::get_tzdb().current_zone()->name().data();
    //print
    std::cout << "Current timezone:" << timezone << std::endl;
    std::chrono::zoned_seconds zt{timezone.c_str(), date};
		
    std::ostringstream oss;
    //oss << std::format("{:%F %T %Z}", zt); //2020-06-15 06:30:30 GMT+8
    oss << std::format("{:%F}", zt);         //2020-06-15
        
    return oss.str();
}

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言